﻿using UnityEngine;

namespace Obi
{
    public struct ColliderShape
    {
        public enum ShapeType
        {
            Sphere = 0,
            Box = 1,
            Capsule = 2,
            Heightmap = 3,
            TriangleMesh = 4,
            EdgeMesh = 5,
            SignedDistanceField = 6
        }

        public Vector4 center;   
        public Vector4 size;     /**<     box: size of the box in each axis.
                                          sphere: radius of sphere (x,y,z),
                                          capsule: radius (x), height(y), direction (z, can be 0, 1 or 2).
                                          heightmap: width (x axis), height (y axis) and depth (z axis) in world units.*/
        public ShapeType type;
        public float contactOffset;
        public int dataIndex;
        public int rigidbodyIndex;  // index of the associated rigidbody in the collision world.
        public int materialIndex;   // index of the associated material in the collision world.
        public int forceZoneIndex;  // index of the associated force zone in the collision world.
        public int filter;          // bitwise category/mask.
        public int flags;           // first bit whether the collider is 2D (1) or 3D (0), second bit whether it's a trigger (1) or regular collider (0),
                                    // third bit (sign) determines whether shape is inverted or not.

        public bool is2D
        {
            get => (flags & 1) != 0;
            set => flags |= value ? 1 : 0;
        }
        public bool isTrigger
        {
            get => ((flags & 1 << 1) != 0) || forceZoneIndex >= 0;
            set => flags |= value ? 1 << 1 : 0;
        }
        public float sign
        {
            get => (flags & 1 << 2) != 0 ? -1 : 1;
        }

        public void SetSign(bool inverted)
        {
            if (inverted) flags |= 1 << 2;
            else flags &= ~(1 << 2);
        }

    }
}
